package defi2;

import chiffrement.IChiffrement;
import ihm.ChoixDuFichier;
import Utils.Fichier;
import Utils.Utils;
import donnees.Variables;

public class Dechiffrement2 implements IChiffrement {

	private ChoixDuFichier c;
	private String messageCrypte = "";
	private String cle = "";
	private String messageClair = "";

	public Dechiffrement2() {
		c = new ChoixDuFichier(this);
	}

	@Override
	public void lancer() {
		Fichier f = new Fichier(c.getFichier());
		messageCrypte = f.getContenu();
		VigenereCoincidence vc = new VigenereCoincidence(messageCrypte);
		TrouverCleVig tvg = new TrouverCleVig(messageCrypte, vc.trouverCle());
		System.out.println("La cle est de taille " + tvg.getLongueurCle() + "\n");
		cle = tvg.getCle();
		System.out.println("La cle est : " + cle + "\n");
		messageClair = dechiffrer();
		System.out.println("Le message clair : \n" + messageClair + "\n");
		Fichier fDecode = new Fichier();
		fDecode.ecrire("decodeDefi2.txt", messageClair);
		System.out.println(messageClair);

	}

	public String dechiffrer() {

		int tailleCle = cle.length();
		int indiceCourant = 0;
		int indiceClair = 0;
		char charCourant;

		for (int i = 0; i < messageCrypte.length(); i++) {
			if (!Utils.contient(messageCrypte.charAt(i), Variables.majuscule)) {
				messageClair = messageClair + messageCrypte.charAt(i);
			} else {
				// charCourant = charCourant - cle.charAt(indiceCourant) puis on
				// ajoute le charCourant decrypte a la chaine

				// le char en cours - le char correspondant de la clé
				indiceClair = (Utils.indice(messageCrypte.charAt(i),
						Variables.majuscule) - Utils.indice(
						cle.charAt(indiceCourant), Variables.majuscule));

				// modulo la taille de l'alphabet
				indiceClair = Utils.modulo(indiceClair,
						Variables.majuscule.length());

				charCourant = Variables.majuscule.charAt(indiceClair);
				messageClair = messageClair + charCourant;

				// Si nous ne sommes pas ou bout de la clé on avance d'un
				// caractere
				if (indiceCourant < tailleCle - 1) {
					indiceCourant++;
				}
				// Sinon on retourne au debut de la cle.
				else {
					indiceCourant = 0;
				}
			}
		}

		return messageClair;
	}

	/**
	 * @return the c
	 */
	public ChoixDuFichier getC() {
		return c;
	}

	/**
	 * @param c
	 *            the c to set
	 */
	public void setC(ChoixDuFichier c) {
		this.c = c;
	}

	/**
	 * @return the messageCrypte
	 */
	public String getMessageCrypte() {
		return messageCrypte;
	}

	/**
	 * @param messageCrypte
	 *            the messageCrypte to set
	 */
	public void setMessageCrypte(String messageCrypte) {
		this.messageCrypte = messageCrypte;
	}

	/**
	 * @return the cle
	 */
	public String getCle() {
		return cle;
	}

	/**
	 * @param cle
	 *            the cle to set
	 */
	public void setCle(String cle) {
		this.cle = cle;
	}

	/**
	 * @return the messageClair
	 */
	public String getMessageClair() {
		return messageClair;
	}

	/**
	 * @param messageClair
	 *            the messageClair to set
	 */
	public void setMessageClair(String messageClair) {
		this.messageClair = messageClair;
	}
}
